package org.openrbac.rbac.vo;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author bapie
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class R<T> {
    /**
     * 状态码
     */
    private int code;
    /**
     * 附加信息
     */
    private String msg;
    /**
     * 返回数据
     */
    @JsonInclude
    private T data;

    public static <T> R<T> build(int code, String msg, T data) {
        return new R<>(code, msg, data);
    }

    /**
     * 成功无返回结果
     *
     * @param <T> /
     * @return /
     */
    public static <T> R<T> ok() {
        return build(RCode.SUCCESS.getCode(), RCode.SUCCESS.getMsg(), null);
    }

    /**
     * 成功但有返回结果
     *
     * @param <T> /
     * @return /
     */
    public static <T> R<T> ok(T data) {
        return build(RCode.SUCCESS.getCode(), RCode.SUCCESS.getMsg(), data);
    }

    /**
     * 成功自定义附加信息有返回结果
     *
     * @param <T> /
     * @return /
     */
    public static <T> R<T> ok(String msg, T data) {
        return build(RCode.SUCCESS.getCode(), msg, data);
    }

    /**
     * 错误自定义错误码和附加信息无返回结果
     *
     * @param <T> /
     * @return /
     */
    public static <T> R<T> error(int code, String msg) {
        return build(code, msg, null);
    }

    /**
     * 错误自定义错误码无附加信息无返回结果
     *
     * @param <T> /
     * @return /
     */
    public static <T> R<T> error(int code) {
        return build(code, null, null);
    }

    /**
     * 错误无返回结果
     *
     * @param <T> /
     * @return /
     */
    public static <T> R<T> error() {
        return build(RCode.ERROR.getCode(), RCode.ERROR.getMsg(), null);
    }
    /**
     * 错误无返回结果
     *
     * @param <T> /
     * @return /
     */
    public static <T> R<T> error(String msg) {
        return build(RCode.ERROR.getCode(), msg, null);
    }
}
